/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja4;

import java.util.LinkedList;

/**
 *
 * @author asus
 */
public class ListStack<E> extends AbstractStack<E> {
    
    /**
     * Lista para la implementación
     */
    private LinkedList linkedList;
            
    /**
     * Tamaño de la pila
     */
    private int size;        
    
    /**
     * Constructor de la clase
     */
    public ListStack() {
        linkedList = new LinkedList();
    }
        
    /**
     * Regresa el tamaño de la pila
     * @return size: Tamaño de la pila
     */
    public int size() {
        return size;
    }
    
    /**
     * Agrega un elemento hasta arriba del stack
     * post: El parámetro fue añadido hasta arriba del stack
     * @param item: Elemento a agregar
     */
    public void add(E item) {
        linkedList.add(item);
        size++;
    }

    /**
     * Agrega un elemento hasta arriba del stack
     * post: El parámetro fue añadido hasta arriba del stack
     * @param item: Elemento a agregar
     */
    public void push(E item) {
        linkedList.add(item);
        size++;
    }

    /**
     * Elimina el elemento hasta arriba de la pila
     * post: El elemento hasta arriba de la pila fue eliminado
     * @return objeto: Elemento eliminado
     */
    public E remove() {
        E objeto = (E) linkedList.get(size-1);
        if (size != 0) linkedList.remove(size-1);
        return objeto;
    }

    /**
     * Saca el último elemento de la pila
     * pre: size > 0
     * post: Devuelve el elemento hasta arriba de la pila, que también fue eliminado
     * @return objeto: Último objeto de la pila
     */
    public E pop() {
        E objeto = (E) linkedList.get(size-1);
        linkedList.remove(size-1);
        size--;
        return objeto;
    }
    
    /**
     * Devuelve el último objeto de la pila
     * pre: size > 0
     * post: Devuelve el elemento hasta arriba de la pila. No es eliminado.
     * @return objeto: Último objeto de la pila 
     */
    public E get() {
        E objeto = (E) linkedList.get(size-1);
        return objeto;
    }

    /**
     * Devuelve el último objeto de la pila
     * pre: size > 0
     * post: Devuelve el elemento hasta arriba de la pila. No es eliminado.
     * @return objeto: Último objeto de la pila 
     */
    public E getFirst() {
        E objeto = (E) linkedList.get(size-1);
        return objeto;
    }

    /**
     * Devuelve el último objeto de la pila
     * pre: size > 0
     * post: Devuelve el elemento hasta arriba de la pila. No es eliminado.
     * @return objeto: Último objeto de la pila 
     */
    public E peek() {
        E objeto = (E) linkedList.get(size-1);
        return objeto;
    }

    /**
     * Devuelve verdadero si la pila está vacía
     * @return true Si la pila está vacía
     */
    public boolean empty() {
        if (size == 0) return true;
        return false;
    }
    
}
